﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Net.Mail;
using System.Net;
using SMG.Presentation.Generics;

namespace SMG.Presentation
{
    /// <summary>
    /// Interaction logic for WEnviarEmail.xaml
    /// </summary>
    public partial class WEnviarEmail : Window
    {
        public WEnviarEmail()
        {
            InitializeComponent();
        }

        List<Pessoa> pessoas;
        List<Grupo> grupos;

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.CarregarListas();
        }

        private void CarregarListas()
        {
            try
            {
                using (Data bd = new Data(Util.getConnectionString()))
                {
                    pessoas = (from s in bd.Pessoas
                             select s).ToList();

                    grupos = (from g in bd.Grupos
                               select g).ToList();
                }

                foreach (Pessoa pessoa in pessoas)
                {
                    if (pessoa.CodigoGrupo.HasValue)
                        pessoa.Grupo = grupos.Where(q => q.Codigo.Equals(pessoa.CodigoGrupo)).First();
                }

                this.lstContato.ItemsSource = pessoas;
                this.lstGrupo.ItemsSource = grupos;
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void txtNomeContato_TextChanged(object sender, TextChangedEventArgs e)
        {
            try
            {
                this.lstContato.ItemsSource = pessoas.Where(q => q.Nome.ToUpper().Contains(this.txtNomeContato.Text.ToUpper())).ToList();
            }
            catch (Exception)
            {
                MessageBox.Show("Erro ao filtrar contatos.");
            }
        }

        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(this.txtDestino.Text))
                {
                    MessageBox.Show("Informe algum email.");
                    return;
                }

                if (String.IsNullOrEmpty(this.txtCorpo.ToString()))
                {
                    MessageBox.Show("Email em branco, favor digitar algo.");
                    return;
                }

                Config cfg;
                using (Data db = new Data(Util.getConnectionString()))
                {
                    cfg = (from c in db.Configs
                                 select c).First();

                    cfg.Servidor = (from s in db.Servidors
                                    where s.Codigo.Equals(cfg.CodigoServidor)
                                    select s).First();
                }

                if (!cfg.Email.Contains("@") || !cfg.Email.Contains("."))
                {
                    MessageBox.Show("Será necessário configurar uma conta de email. Por favor, preencha o cadastro.");
                    return;
                }

                MailMessage message = new MailMessage();
                message.From = new MailAddress(cfg.Email, cfg.Nome);

                SmtpClient smtp = new SmtpClient(cfg.Servidor.SMTP, Int32.Parse(cfg.Servidor.Porta.ToString()));
                smtp.EnableSsl = cfg.Servidor.usaSSL;
                message.Subject = this.txtAssunto.Text;
                message.IsBodyHtml = true;
                message.Body = this.txtCorpo.ToString();

                smtp.Credentials = new NetworkCredential(cfg.Email, cfg.Senha);

                string[] todosEmails = this.txtDestino.Text.Split(',');

                if (chkTodos.IsChecked.HasValue && chkTodos.IsChecked.Value.Equals(true))
                {
                    foreach (string item in todosEmails)
                    {
                        message.To.Add(item);
                    }
                    smtp.Send(message);
                }
                else
                {
                    foreach (string item in todosEmails)
                    {
                        message.To.Add(item);
                        smtp.Send(message);
                        message.To.Clear();
                    }
                }

                MessageBox.Show("Email enviado com sucesso.");
            }
            catch (ArgumentNullException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (ObjectDisposedException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (SmtpFailedRecipientException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (SmtpException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (InvalidOperationException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void lstContato_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (this.lstContato.SelectedItem != null)
                {
                    string email = ((Pessoa)this.lstContato.SelectedItem).Email;

                    adicionaEmail(email);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Erro ao selecionar contato.");
            }
        }

        private void txtNomeGrupo_TextChanged(object sender, TextChangedEventArgs e)
        {
            try
            {
                this.lstGrupo.ItemsSource = grupos.Where(q => q.Nome.ToUpper().Contains(this.txtNomeGrupo.Text.ToUpper())).ToList();
            }
            catch (Exception)
            {
                MessageBox.Show("Erro ao filtrar grupos.");
            }
        }

        private void lstGrupo_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (this.lstGrupo.SelectedItem != null)
                {
                    int codigo = ((Grupo)this.lstGrupo.SelectedItem).Codigo;

                    List<Pessoa> pessoaDoGrupo = pessoas.Where(q => q.CodigoGrupo.Equals(codigo)).ToList();

                    foreach (Pessoa pessoa in pessoaDoGrupo)
                    {
                        string email = pessoa.Email;

                        adicionaEmail(email);
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Erro ao selecionar contato.");
            }
        }

        private void adicionaEmail(string email)
        {
            if (this.txtDestino.Text.Contains(email))
                return;

            if (!String.IsNullOrEmpty(this.txtDestino.Text))
                this.txtDestino.Text += " ,";

            this.txtDestino.Text += email;
        }
    }
}
